package cl.rivendel.views;

import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.Vector;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.table.DefaultTableModel;

import cl.rivendel.modelo.Jugador;

public class GestionadorLiga extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JMenu mnFile;
	private JMenuItem mntmSalir;
	private JTextField txfJugador;
	private JButton btnNuevo;
	private JTable table;
	private LinkedList<Jugador> listado;
	private static Vector<String> columnNames;
	private static DefaultTableModel model;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GestionadorLiga frame = new GestionadorLiga();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public GestionadorLiga() {
		setTitle("Gestionador de Rondas ");
		setIconImage(Toolkit
				.getDefaultToolkit()
				.getImage(
						GestionadorLiga.class
								.getResource("/resources/images/104822-Magic_The_Gathering_Mana.png")));

		initComponents();
		initEvents();
		initTableProperties();
		loadTable();

	}

	private void initTableProperties() {
		table.getTableHeader().setReorderingAllowed(false); // we do not allow
															// to move columns
		table.setRowHeight(25);

		// column names
		Vector<String> nombresCols = new Vector<String>();

		nombresCols.add("Nombre");
		nombresCols.add("Puntos");
		nombresCols.add("Logros");

		columnNames = nombresCols;

	}

	private void initEvents() {

		// ========================================
		// click on table rows
		// ========================================
		table.addMouseListener(new MouseAdapter() {

			public void mouseClicked(MouseEvent me) {
				int row = table.rowAtPoint(me.getPoint());
				int col = table.columnAtPoint(me.getPoint());

				if (row > -1 && col < 2) { // control of bounds
					System.out.println("se ha presionado la fila: " + row
							+ "mas la columna " + col);
				}
			}
		});

		// ========================================
		// click on buttons agregar
		// ========================================

		btnNuevo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (!txfJugador.getText().isEmpty()) {

					Jugador jugador = new Jugador();

					jugador.setNombre(txfJugador.getText());

					addJugador(jugador);

				}
			}

		});

		// ========================================
		// click on menu item Salir
		// ========================================
		mntmSalir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0); // close all application
			}
		});

	}

	private void initComponents() {

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 800, 600);

		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		mnFile = new JMenu("Archivo");
		menuBar.add(mnFile);

		mntmSalir = new JMenuItem("Salir");

		mnFile.add(mntmSalir);
		contentPane = new JPanel();
		setContentPane(contentPane);

		JPanel panel = new JPanel();

		JScrollPane scrollPane = new JScrollPane();
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane
				.setHorizontalGroup(gl_contentPane
						.createParallelGroup(Alignment.LEADING)
						.addGroup(
								gl_contentPane
										.createSequentialGroup()
										.addGroup(
												gl_contentPane
														.createParallelGroup(
																Alignment.LEADING)
														.addGroup(
																gl_contentPane
																		.createSequentialGroup()
																		.addGap(10)
																		.addComponent(
																				scrollPane,
																				GroupLayout.DEFAULT_SIZE,
																				764,
																				Short.MAX_VALUE))
														.addGroup(
																gl_contentPane
																		.createSequentialGroup()
																		.addContainerGap()
																		.addComponent(
																				panel,
																				GroupLayout.DEFAULT_SIZE,
																				764,
																				Short.MAX_VALUE)))
										.addContainerGap()));
		gl_contentPane.setVerticalGroup(gl_contentPane.createParallelGroup(
				Alignment.LEADING).addGroup(
				gl_contentPane
						.createSequentialGroup()
						.addComponent(panel, GroupLayout.PREFERRED_SIZE, 69,
								GroupLayout.PREFERRED_SIZE)
						.addPreferredGap(ComponentPlacement.UNRELATED)
						.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE,
								450, Short.MAX_VALUE).addContainerGap()));

		table = new JTable();
		scrollPane.setViewportView(table);

		JLabel lblJugador = new JLabel("Jugador");

		txfJugador = new JTextField();
		txfJugador.setColumns(10);

		btnNuevo = new JButton("Agregar");

		GroupLayout gl_panel = new GroupLayout(panel);
		gl_panel.setHorizontalGroup(gl_panel.createParallelGroup(
				Alignment.LEADING).addGroup(
				gl_panel.createSequentialGroup()
						.addContainerGap()
						.addComponent(lblJugador)
						.addPreferredGap(ComponentPlacement.UNRELATED)
						.addComponent(txfJugador, GroupLayout.PREFERRED_SIZE,
								360, GroupLayout.PREFERRED_SIZE)
						.addPreferredGap(ComponentPlacement.UNRELATED)
						.addComponent(btnNuevo)
						.addContainerGap(264, Short.MAX_VALUE)));
		gl_panel.setVerticalGroup(gl_panel
				.createParallelGroup(Alignment.LEADING)
				.addGroup(
						gl_panel.createSequentialGroup()
								.addGap(24)
								.addGroup(
										gl_panel.createParallelGroup(
												Alignment.BASELINE)
												.addComponent(lblJugador)
												.addComponent(
														txfJugador,
														GroupLayout.PREFERRED_SIZE,
														GroupLayout.DEFAULT_SIZE,
														GroupLayout.PREFERRED_SIZE)
												.addComponent(btnNuevo))
								.addContainerGap(29, Short.MAX_VALUE)));
		panel.setLayout(gl_panel);
		contentPane.setLayout(gl_contentPane);

		// se inicializa la lista de jugadores
		listado = new LinkedList<Jugador>();

	}

	private void loadTable() {

		Vector<Object> jugadorData;

		model = new DefaultTableModel(null, columnNames); // first we add the
															// column names

		table.setModel(model); // update the model
		table.setRowSorter(null);

		// we add each row of the table
		for (Jugador c : listado) {
			jugadorData = new Vector<Object>(); // we load a vector with the
												// data of each row

			jugadorData.add(c.getNombre()); // data for the column "Nombre"
			jugadorData.add(c.getPuntos()); // data for the column "Punto"
			jugadorData.add(c.getLogros()); // data for the column "Logro"

			model.addRow(jugadorData); // we add all data to the table model
		}
		table.setModel(model); // update the model

		// Now, we have the model loaded, so we can modify its column properties
		table.getColumnModel().getColumn(0).setResizable(false);
		table.getColumnModel().getColumn(0).setPreferredWidth(200);

		table.getColumnModel().getColumn(1).setResizable(false);
		table.getColumnModel().getColumn(1).setPreferredWidth(200);

		table.getColumnModel().getColumn(2).setResizable(false);
		table.getColumnModel().getColumn(2).setPreferredWidth(200);

	}

	public void addJugador(Jugador p_jugador) {

		if (model == null) {
			model = new DefaultTableModel(null, columnNames); // first we add
																// the

		}

		Vector<Object> jugadorData;
		jugadorData = new Vector<Object>();

		jugadorData.add(p_jugador.getNombre()); // data for the column "Nombre"
		jugadorData.add(p_jugador.getPuntos()); // data for the column "Punto"
		jugadorData.add(p_jugador.getLogros()); // data for the column "Logro"

		model.addRow(jugadorData); // we add all data to the table model
		table.setModel(model); // update the model

	}
}
